package com.aco.party.common.entity;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


/**
 * <pre>
 * @(#)BaseEntity.java 2013-08-01
 *
 * @功能说明：
 * 所有实体类基类,定义属性如下：
 * 1:定义动态字段,
 * 2:最大行数
 * 3:起始行数（oracle物理行号从1开始）
 * 4:结束行数（如果不设置结束行，缺省查所有满足条件记录）
 * 5:排序字段
 * 6:正序|反序(例ASC).
 * 
 * @版本更新列表
 *</pre>
 */
public class BaseEntity implements Serializable{
	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -2565357994612141649L;

	/** 
	 * 最大行数.
	 */
	private static final int MAX_ROWS = 9999999;
	
	/** 
	 * 起始行数（oracle物理行号从1开始）. 
	 */
	private int start = 1;

	/**
	 * 结束行数（如果不设置结束行，缺省查所有满足条件记录）.
	 */
	private int end = MAX_ROWS;

	/**
	 * 排序字段.
	 */
	private String sort;

	/**
	 * 正序|反序(例ASC).
	 */
	private String order;
	
	/**
	 * 动态字段. 在ibatis文件中可用“dynamicFields.xxx”方式读取动态字段值
	 */
	protected Map<String, Object> dynamicFields = new HashMap<String, Object>();

	/**
	 * 设置动态字段值.
	 * 
	 * @param fieldName
	 *            字段名称
	 * @param value
	 *            字段值
	 */
	public void setField(String fieldName, Object value) {
		dynamicFields.put(fieldName, value);
	}

	/**
	 * 返回动态字段值.
	 * 
	 * @param fieldName
	 *            字段名称
	 * @return 对象
	 */
	public Object getField(String fieldName) {
		if (dynamicFields == null) {
			return null;
		}
		return getDynamicFields().get(fieldName);
	}

	public void setDynamicFields(Map<String, Object> dynamicFields) {
		this.dynamicFields = dynamicFields;
	}

	/**
	 * 
	 * 动态字段除NULL
	 */
	public Map<String, Object> getDynamicFields() {
		if (dynamicFields != null && dynamicFields.size() > 0) {
			Set<?> set = dynamicFields.keySet();
			for (Iterator<?> iterator = set.iterator(); iterator.hasNext();) {
				String key = (String) iterator.next();
				if (dynamicFields.get(key) != null && dynamicFields.get(key).getClass().isArray()) {
					Object[] objArr = (Object[]) dynamicFields.get(key);
					if (objArr.length == 1) {
						dynamicFields.put(key, ((Object[]) dynamicFields.get(key))[0]);
					}
				}
			}
		}
		return dynamicFields;
	}

	/**
	 * clear object properties
	 * 
	 * @param clazz
	 * @param nullInstanse
	 */
	public static void clear(Class<?> clazz, Object nullInstanse) {
		if (clazz != null && nullInstanse != null) {
			Method[] mds = clazz.getDeclaredMethods();
			for (Method method : mds) {
				if (method.getName().startsWith("set")) {
					try {
						method.invoke(nullInstanse, new Object[] { null });
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		}
	}

	public String getSort() {
		return sort;
	}

	public void setSort(String sort) {
		this.sort = sort;
	}

	public String getOrder() {
		return order;
	}

	public void setOrder(String order) {
		this.order = order;
	}

	public int getStart() {
		return start;
	}

	public void setStart(int start) {
		this.start = start;
	}

	public int getEnd() {
		return end;
	}

	public void setEnd(int end) {
		this.end = end;
	}

}
